/**
 * @file categories/dp/state_compress/noi2001artillery/main.cpp
 * @brief
 * @see
 * @author Ruiming Guo (guoruiming@stu.scu.edu.cn)
 * @copyright 2022
 * @date 2022/7/6 16:06:31
 **/

#include <iostream>
#include <vector>

using namespace std;
const int N = 110, M = 1 << 10;
int n, m;
int g[N], cnt[M];
int f[2][M][M];
vector<int> state;
vector<int> head[M];
bool check(int st) { return !(st & st >> 1 || st & st >> 2); }
int count(int st) {
  int res = 0;
  while (st) res += st & 1, st >>= 1;
  return res;
}
int main() {
  cin >> n >> m;
  for (int i = 1, j = 0; i <= n; ++i, j = 0)
    for (char c; j < m && cin >> c; ++j) g[i] += (c == 'H') << j;
  for (int st = 0; st < 1 << m; ++st)
    if (check(st)) state.push_back(st), cnt[st] = count(st);
  for (int cur_st : state)
    for (int pre_st : state)
      if (!(cur_st & pre_st)) head[cur_st].push_back(pre_st);
  for (int i = 1; i <= n; ++i)
    for (int st : state)
      if (!(g[i] & st))
        for (int p1 : head[st])
          for (int p2 : head[p1])
            if (!(st & p2))
              f[i & 1][st][p1] =
                  max(f[i & 1][st][p1], f[i - 1 & 1][p1][p2] + cnt[st]);
  int res = 0;
  for (int st : state)
    for (int pre : head[st]) res = max(res, f[n & 1][st][pre]);
  cout << res << endl;
}
